package com.hmall.item.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.hmall.common.domain.PageDTO;
import com.hmall.common.domain.PageQuery;
import com.hmall.common.utils.BeanUtils;
import com.hmall.item.domain.dto.ItemDTO;
import com.hmall.item.domain.dto.OrderDetailDTO;
import com.hmall.item.domain.po.Item;
import com.hmall.item.service.IItemService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 商品管理控制器
 * 提供商品的CRUD操作、分页查询、库存扣减等接口
 */
@Api(tags = "商品管理相关接口")
@RestController
@RequestMapping("/items")
@RequiredArgsConstructor
public class ItemController {

    // 注入商品业务接口
    private final IItemService itemService;

    // 注入 RabbitMQ 消息队列接口
    private final RabbitTemplate rabbitTemplate;

    /**
     * 分页查询商品列表
     * @param query 分页查询参数（包含页码、每页大小等）
     * @return 分页包装的商品DTO列表
     */
    @ApiOperation("分页查询商品")
    @GetMapping("/page")
    public PageDTO<ItemDTO> queryItemByPage(PageQuery query) {

        // 1. 转换为MyBatis-Plus的分页对象，按更新时间倒序排列
        Page<Item> page = query.toMpPage("update_time", false);
        // 2. 调用Service层分页查询方法
        Page<Item> result = itemService.page(page);
        // 3. 将实体列表转换为DTO列表并封装到分页DTO中
        return PageDTO.of(result, ItemDTO.class);
    }

    /**
     * 根据商品ID集合批量查询商品
     * @param ids 商品ID列表
     * @return 商品DTO列表
     */
    @ApiOperation("根据id批量查询商品")
    @GetMapping
    public List<ItemDTO> queryItemByIds(@RequestParam("ids") List<Long> ids) {
        return itemService.queryItemByIds(ids);
    }

    /**
     * 根据商品ID查询单个商品
     * @param id 商品ID
     * @return 商品DTO
     */
    @ApiOperation("根据id查询商品")
    @GetMapping("{id}")
    public ItemDTO queryItemById(@PathVariable("id") Long id) {
        // 查询商品实体并转换为DTO
        return BeanUtils.copyBean(itemService.getById(id), ItemDTO.class);
    }

    /**
     * 新增商品
     * @param item 商品DTO（请求体）
     */
    @ApiOperation("新增商品")
    @PostMapping
    public void saveItem(@RequestBody ItemDTO item) {
        // 1. 将DTO转换为实体类
        Item entity = BeanUtils.copyBean(item, Item.class);
        // 2. 调用Service层保存方法
        itemService.save(entity);
        // 3. 发送消息到MQ，通知搜索服务更新索引
        rabbitTemplate.convertAndSend("search.direct", "item.index", entity.getId());
    }

    /**
     * 更新商品状态
     * @param id 商品ID
     * @param status 商品状态（1-正常，2-下架，3-删除）
     */
    @ApiOperation("更新商品状态")
    @PutMapping("/status/{id}/{status}")
    public void updateItemStatus(@PathVariable("id") Long id, @PathVariable("status") Integer status) {

        // 1. 创建商品实体，仅设置ID和状态
        Item item = new Item();
        item.setId(id);
        item.setStatus(status);
        // 2. 调用Service层更新方法（仅更新有值的字段）
        itemService.updateById(item);
    }

    /**
     * 更新商品信息
     * @param item 商品DTO（请求体）
     */
    @ApiOperation("更新商品")
    @PutMapping
    public void updateItem(@RequestBody ItemDTO item) {
        // 1. 禁止更新商品状态（强制设为null）
        item.setStatus(null);
        // 2. 将DTO转换为实体类
        Item entity = BeanUtils.copyBean(item, Item.class);
        // 3. 调用Service层更新方法
        itemService.updateById(entity);
        // 4. 发送消息到MQ，通知搜索服务更新索引
        rabbitTemplate.convertAndSend("search.direct", "item.update", entity.getId());
    }

    /**
     * 根据ID删除商品（逻辑删除）
     * @param id 商品ID
     */
    @ApiOperation("根据id删除商品")
    @DeleteMapping("{id}")
    public void deleteItemById(@PathVariable("id") Long id) {
        // 1. 调用Service层删除方法（逻辑删除，更新deleted字段）
        itemService.removeById(id);
        // 2. 发送消息到MQ，通知搜索服务删除索引
        rabbitTemplate.convertAndSend("search.direct", "item.delete", id);
    }

    /**
     * 批量扣减商品库存
     * @param items 订单明细列表（包含商品ID和扣减数量）
     */
    @ApiOperation("批量扣减库存")
    @PutMapping("/stock/deduct")
    public void deductStock(@RequestBody List<OrderDetailDTO> items) {
        // 调用Service层批量扣减库存方法
        itemService.deductStock(items);
    }
}